package com;

import java.util.Date;

/**
 * 1 如何获取运行时类
 * 
 * 2 如何通过反射创建对内存对象
 * 
 * 3 如何声明可变长参数
 * 
 * 4 如何通过反射获取所有的变量 / 指定变量
 * 
 * 5 如何通过反射获取所有的方法 / 指定方法
 * 
 * 6 如何通过反射调用方法 / 变量
 * 
 * 7 如何通过指定的构造方法创建对象
 * 
 * 8 如何通过反射获取父类类型
 * 
 * 9 如何通过反射获取所有的构造方法
 * 
 * @author yingfing
 * @date 2020年10月2日 @time 下午5:37:47
 */
public class Reflect_01 {
	public static void main(String[] args)
			throws ClassNotFoundException, InstantiationException, IllegalAccessException {
//		test1();
		test2();
	}

	/**
	 * 通过运行时类的三种获取方式
	 * 
	 * @throws ClassNotFoundException
	 */
	public static void test1() throws ClassNotFoundException {
		// 1. 把类载入到内存中
		// 通过类全名的字符串获取
		Class class1 = Class.forName("java.land.Integer");

		// 2. class 是每个类的属性
		// 通过 class 属性获取
		Class class2 = Integer.class;

		// 3. getClass()是 Object 中的方法,所以每个对象都有
		// 通过 getClass() 方法 获取
		Integer i1 = new Integer(11);
		Class class3 = i1.getClass();

		System.out.println(class1);
		System.out.println(class2);
		System.out.println(class3);
		System.out.println(class1 == class2);

		Class class4 = int.class;
		Class class5 = void.class;
	}

	/**
	 * 通过反射创建堆内存对象
	 * 
	 * @throws ClassNotFoundException
	 * @throws InstantiationException
	 * @throws IllegalAccessException
	 */
	public static void test2() throws ClassNotFoundException, InstantiationException, IllegalAccessException {

		Date date = new Date();

		Class class1 = Class.forName("java.util.Date");
		// newInstance 相当于 new Date()
		Date o1 = (Date) class1.newInstance();
		System.out.println(o1);
	}
}
